---
title: java 练习
date: 2024-4-12 22:10:43 
images: ['https://kodo.huixiangwuyou.com/blog/images/lianxi.png']
tags: 
 - java
---


## 面试题

### springboot 启动流程


```shell >folded
1. @SpringBootApplication 通过启动类启动服务
  1.1 @Configuration：标记配置类
  1.2 @EnableAutoConfiguration：启用自动配置
  1.3 @ComponentScan：扫描当前包及子包下的组件（如 @Component, @Service 等）。
  1.4 加载 ApplicationListener：监听 Spring Boot 事件和操作
  1.5 加载 ApplictionContextInitializer：初始化上下文
2. SpringApplication.run() 执行流程
  2.1 创建实例
  2.2  执行 run() 方法 加载 Spring 运行环境（Environment）
  2.3  刷新容器
3. 环境准备
  3.1 环境准备：加载 application.properties/application.yml 配置、解析环境变量、命令行参数等
  3.2  创建 ApplicationContext (createApplicationContext)： 根据应用类型选择上下文实现
  3.3  刷新上下文 (refreshContext)：加载 Bean 定义、实例化单例 Bean、初始化 AOP、​启动嵌入式容器
  3.4 自动配置 (@EnableAutoConfiguration)：条件化配置（@ConditionalOnClass, @ConditionalOnMissingBean 等）决定是否生效
  3.5 触发事件：生命周期事件：
ApplicationStartingEvent → ApplicationEnvironmentPreparedEvent → ApplicationContextInitializedEvent → ApplicationPreparedEvent → ContextRefreshedEvent → ApplicationStartedEvent → ApplicationReadyEvent → ApplicationFailedEvent（失败时）
4.扩展点
  4.1 ApplicationContextInitializer：在上下文刷新前修改配置
  4.2 ApplicationListener：监听应用事件（如环境准备完成、上下文刷新等）
  4.3 SpringApplicationRunListener：监听整个启动过程
  4.4 BeanPostProcessor：在 Bean 初始化前后进行增强
```
#### ApplicationContextlnitializer
I0C容器对象创建完成后执行,可以对上下文环境做一些操作，例如运行环境属性注册等
自定义类,实现ApplicationcontextInitializer接口，在resource/META-INF/spring.factories配置文件中配置自定义的类

```java
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;

public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

		@Override
		public void initialize(ConfigurableApplicationContext applicationContext) {
				System.out.println("【ApplicationContextInitializer】初始化上下文：" + applicationContext.getId());

				// 1. 获取环境变量并修改
				ConfigurableEnvironment environment = applicationContext.getEnvironment();
				System.out.println("当前环境变量：" + environment.getPropertySources());

				// 2. 动态注册一个 Bean（需结合 BeanDefinitionRegistryPostProcessor）
				// 注意：直接在这里注册 Bean 不会生效，因为此时 BeanFactory 尚未准备好
				// 通常需要结合 BeanDefinitionRegistryPostProcessor 使用

				// 3. 其他自定义逻辑（如修改配置文件、注册监听器等）
		}
}

# resource/META-INF/spring.factories
org.springframework.context.ApplicationContextInitializer=/com.example.MyApplicationContextInitializer

```
#### ApplicationListener
监听应用事件，如环境准备完成、上下文刷新等
自定义类，实现ApplicationListener接口，在resource/META-INF/spring.factories配置文件中配置自定义的类

```java
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;

public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent> {

		@Override
		public void onApplicationEvent(ContextRefreshedEvent event) {
				System.out.println("【ApplicationListener】上下文刷新完成：" + event.getApplicationContext().getId());
				// 可以在这里处理上下文刷新完成后的逻辑
				//成功
				if(event instanceof ApplicationReadyEvent) {
						System.out.println("【ApplicationListener】上下文刷新成功");
				}
				if(event instanceof ApplicationFailedEvent) {
						System.out.println("【ApplicationListener】上下文刷新失败");
				}
		}
}

# resource/META-INF/spring.factories
org.springframework.context.ApplicationListener=/com.example.MyApplicationListener

```
#### SpringApplicationRunListener


### springboot IOC 容器初始化流程

```shell >folded

```

### Bean生命周期

[后续学习视频](https://www.bilibili.com/video/BV14z4y1N7pg?spm_id_from=333.788.player.switch&vd_source=9c48247010e4eb8d215e5100842928d4&p=107)
### Bean循环依赖

### BeanFactory
Bean容器的根接口，提供Bean对象的创建、配置、依赖注入等功能

### Spring MVC 执行流程


### BeanFactory 和 ApplicationContext 区别


### Spring AOP


### Spring 事务传播行为


### Spring 事务隔离级别


### Spring 事务失效场景


### Spring 事务实现原理


### Spring MVC 工作流程


### Spring MVC 请求处理流程


### Spring MVC 注解


### Spring MVC 异常处理
